package 其他.长度最小的子数组209;

public class Solution {
    /**
     * 寻找长度最小的子数组，其和至少为target
     * 如果不存在这样的子数组，则返回0
     *
     * @param target 目标和
     * @param nums   输入的整数数组
     * @return 最小长度的子数组长度，如果不存在则返回0
     */
    public int minSubArrayLen(int target, int[] nums) {
        // 数组长度
        int n = nums.length;
        // 左指针
        int left = 0;
        // 初始化结果为n+1，表示一个不可能达到的最大值
        int ans = n + 1;
        // 当前子数组的和
        int s = 0;
        // 遍历数组，右指针从0开始
        for (int right = 0; right < n; right++) {
            // 将当前元素加到子数组的和中
            s += nums[right];
            // 当前和减去最左边的元素仍然大于等于target时，左指针右移，缩小窗口
            while (s - nums[left] >= target) {
                s -= nums[left];
                left++;
            }
            // 如果当前和大于等于target，更新最小子数组长度
            if (s >= target) {
                ans = Math.min(ans, right - left + 1);
            }
        }
        // 如果找到合适的子数组，返回其长度；否则返回0
        return ans <= n ? ans : 0;
    }
}
